Transaction Management

Java Technologies - স্প্রিং বুট ওআরএম (Spring Boot ORM)
191

স্প্রিং বুটে Transaction Management একটি গুরুত্বপূর্ণ বিষয়, যা ডেটাবেস অপারেশনগুলোর নির্ভরযোগ্যতা এবং সঠিকতা নিশ্চিত করে। ট্রানজেকশন ম্যানেজমেন্ট মূলত ডেটাবেসে একাধিক অপারেশনকে একটি একক ইউনিট হিসেবে পরিচালনা করে এবং এটি নিশ্চিত করে যে সব অপারেশন সফল না হলে কোনও পরিবর্তন ডেটাবেসে স্থায়ী হবে না।


ট্রানজেকশন ম্যানেজমেন্ট কি?

ট্রানজেকশন ম্যানেজমেন্ট হলো একাধিক ডেটাবেস অপারেশনকে একটি ইউনিট হিসেবে পরিচালনা করার প্রক্রিয়া। এটি চারটি বৈশিষ্ট্য (ACID properties) অনুসরণ করে:

  1. Atomicity: সব অপারেশন একসাথে সম্পন্ন হবে বা কোনওটাই হবে না।
  2. Consistency: প্রতিটি ট্রানজেকশনের পরে ডেটাবেস একটি সঙ্গত অবস্থায় থাকবে।
  3. Isolation: প্রতিটি ট্রানজেকশন অন্যদের থেকে আলাদা থাকবে।
  4. Durability: একটি সফল ট্রানজেকশন ডেটাবেসে স্থায়ীভাবে সংরক্ষিত থাকবে।

স্প্রিং বুটে ট্রানজেকশন ম্যানেজমেন্ট

স্প্রিং ফ্রেমওয়ার্ক Declarative Transaction Management এবং Programmatic Transaction Management সমর্থন করে। স্প্রিং বুটে সাধারণত Declarative Transaction Management বেশি ব্যবহৃত হয়, যেখানে @Transactional এনোটেশন ব্যবহার করা হয়।


Declarative Transaction Management

@Transactional এনোটেশন

স্প্রিং বুটে @Transactional এনোটেশন ব্যবহার করে সহজেই ট্রানজেকশন ম্যানেজমেন্ট করা যায়। এটি একটি মেথড বা ক্লাসের উপর ব্যবহার করা হয়। ক্লাসের উপর এটি দিলে, ক্লাসের সব মেথডে ট্রানজেকশন প্রযোজ্য হবে।

@Transactional এর ব্যবহার

Transaction Propagation এবং Isolation Level নির্ধারণ করতে @Transactional এনোটেশন কনফিগার করা যায়।

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)

উদাহরণ: ট্রানজেকশন ম্যানেজমেন্ট

Entity ক্লাস

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Account {
    @Id
    private Long id;
    private String name;
    private Double balance;

    // Getter এবং Setter
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getBalance() {
        return balance;
    }
    public void setBalance(Double balance) {
        this.balance = balance;
    }
}

Repository

import org.springframework.data.jpa.repository.JpaRepository;

public interface AccountRepository extends JpaRepository<Account, Long> {
}

Service

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class AccountService {

    @Autowired
    private AccountRepository accountRepository;

    @Transactional
    public void transfer(Long fromAccountId, Long toAccountId, Double amount) {
        Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
        Account toAccount = accountRepository.findById(toAccountId).orElseThrow();

        fromAccount.setBalance(fromAccount.getBalance() - amount);
        toAccount.setBalance(toAccount.getBalance() + amount);

        accountRepository.save(fromAccount);
        accountRepository.save(toAccount);
    }
}

Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/accounts")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @PostMapping("/transfer")
    public String transfer(@RequestParam Long fromAccountId, @RequestParam Long toAccountId, @RequestParam Double amount) {
        accountService.transfer(fromAccountId, toAccountId, amount);
        return "Transfer successful!";
    }
}

Transaction Propagation (প্রচার)

Propagation নির্ধারণ করে একটি নতুন ট্রানজেকশন তৈরি হবে কি না এবং চলমান ট্রানজেকশনের সাথে কাজ করবে কি না।

Propagation Typeবর্ণনা
REQUIREDডিফল্ট মান; চলমান ট্রানজেকশন থাকলে সেটিতে যোগ দেয়। না থাকলে নতুন তৈরি করে।
REQUIRES_NEWসবসময় নতুন ট্রানজেকশন তৈরি করে।
SUPPORTSচলমান ট্রানজেকশন থাকলে সেটিতে কাজ করে; না থাকলে নন-ট্রানজেকশনালভাবে কাজ করে।
MANDATORYচলমান ট্রানজেকশন না থাকলে Exception ছোড়ে।
NOT_SUPPORTEDট্রানজেকশন বন্ধ রেখে নন-ট্রানজেকশনালভাবে কাজ করে।
NEVERট্রানজেকশন থাকলে Exception ছোড়ে।
NESTEDচলমান ট্রানজেকশন থাকলে একটি সাব-ট্রানজেকশন তৈরি করে।

Transaction Isolation Level

Isolation Level নির্ধারণ করে একটি ট্রানজেকশন অন্য ট্রানজেকশন থেকে কীভাবে আলাদা থাকবে।

Isolation Levelবর্ণনা
DEFAULTডেটাবেস ডিফল্ট আইসোলেশন লেভেল ব্যবহার করে।
READ_UNCOMMITTEDআনকমিটেড ডেটা পড়তে দেয়।
READ_COMMITTEDশুধুমাত্র কমিটেড ডেটা পড়তে দেয়।
REPEATABLE_READএকই ট্রানজেকশন একাধিকবার পড়লে একই ফলাফল দেয়।
SERIALIZABLEসর্বোচ্চ আইসোলেশন লেভেল; ডেডলক ঘটতে পারে।

ট্রানজেকশন ম্যানেজমেন্টের সুবিধা

  • ডেটার সঙ্গতি নিশ্চিত করে।
  • ডেটাবেস অপারেশন ব্যর্থ হলে রোলব্যাক করা সহজ।
  • মাল্টি-থ্রেডিং অপারেশনগুলোর মধ্যে সমস্যা এড়ায়।
  • ডেটাবেসে ডেটা দুর্নীতি থেকে রক্ষা করে।

সারমর্ম

স্প্রিং বুটে Transaction Management ডেটাবেস অপারেশনগুলোর জন্য সঠিকতা এবং নির্ভরযোগ্যতা নিশ্চিত করে। @Transactional ব্যবহার করে সহজেই ট্রানজেকশন পরিচালনা করা যায়। ট্রানজেকশন ম্যানেজমেন্ট প্রয়োগ করলে অ্যাপ্লিকেশন আরও স্থিতিশীল এবং নির্ভরযোগ্য হয়।

Content added By

Spring Boot এ Transaction Management এর ধারণা

195

ট্রানজেকশন কী?

ট্রানজেকশন (Transaction) হলো একটি সিরিজ ডেটাবেস অপারেশন যা একটি ইউনিট হিসাবে কাজ করে। একাধিক ডেটাবেস অপারেশন একত্রে সম্পন্ন হতে হবে অথবা একেবারে বাতিল হতে হবে। এটি ACID (Atomicity, Consistency, Isolation, Durability) প্রিন্সিপল অনুসরণ করে।

উদাহরণস্বরূপ: একটি ব্যাংকের অ্যাকাউন্ট ট্রান্সফার সিস্টেমে, যদি এক অ্যাকাউন্ট থেকে টাকা ডেবিট করা হয় এবং অন্য অ্যাকাউন্টে জমা দেওয়া হয়, তবে উভয় অপারেশন সফল হতে হবে। কোনো একটি ব্যর্থ হলে পুরো ট্রানজেকশন বাতিল হবে।


Spring Boot-এ Transaction Management

Spring Boot-এ ট্রানজেকশন ম্যানেজমেন্ট ডাটাবেস অপারেশনের স্থায়িত্ব (Consistency) এবং সঠিকতা (Integrity) নিশ্চিত করে। Spring Framework ট্রানজেকশন ম্যানেজমেন্টের জন্য শক্তিশালী ও নমনীয় সমাধান প্রদান করে।

দুটি ট্রানজেকশন ম্যানেজমেন্ট পদ্ধতি:

  1. Declarative Transaction Management: @Transactional অ্যানোটেশন ব্যবহার করে ট্রানজেকশন নির্ধারণ করা হয়।
  2. Programmatic Transaction Management: TransactionTemplate বা PlatformTransactionManager এর মাধ্যমে কোডের মাধ্যমে ট্রানজেকশন নিয়ন্ত্রণ করা হয়।

Declarative Transaction Management

@Transactional অ্যানোটেশন ব্যবহার করে ট্রানজেকশন নির্ধারণ করা হয়। এটি Spring Framework-এ ট্রানজেকশন ম্যানেজমেন্টের সবচেয়ে জনপ্রিয় পদ্ধতি।

উদাহরণ: @Transactional ব্যবহার

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class BankService {
    @Autowired
    private AccountRepository accountRepository;

    @Transactional
    public void transferMoney(Long fromAccountId, Long toAccountId, Double amount) {
        Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
        Account toAccount = accountRepository.findById(toAccountId).orElseThrow();

        fromAccount.setBalance(fromAccount.getBalance() - amount);
        toAccount.setBalance(toAccount.getBalance() + amount);

        accountRepository.save(fromAccount);
        accountRepository.save(toAccount);
    }
}

কী ঘটে @Transactional এর মাধ্যমে?

  • সব ডাটাবেস অপারেশন একটি ট্রানজেকশন ব্লকের মধ্যে সম্পন্ন হয়।
  • যদি কোনো অপারেশনে সমস্যা হয় (যেমন Exception), তবে সমস্ত পরিবর্তন বাতিল (Rollback) হয়।

Programmatic Transaction Management

Programmatic Transaction Management ব্যবহার করে আপনি কোডের মাধ্যমে ট্রানজেকশন শুরু, কমিট এবং রোলব্যাক নিয়ন্ত্রণ করতে পারেন।

উদাহরণ: TransactionTemplate ব্যবহার

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;

@Service
public class BankService {
    @Autowired
    private TransactionTemplate transactionTemplate;

    @Autowired
    private AccountRepository accountRepository;

    public void transferMoney(Long fromAccountId, Long toAccountId, Double amount) {
        transactionTemplate.executeWithoutResult(transactionStatus -> {
            Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
            Account toAccount = accountRepository.findById(toAccountId).orElseThrow();

            fromAccount.setBalance(fromAccount.getBalance() - amount);
            toAccount.setBalance(toAccount.getBalance() + amount);

            accountRepository.save(fromAccount);
            accountRepository.save(toAccount);
        });
    }
}

@Transactional এর গুরুত্বপূর্ণ বৈশিষ্ট্য

Propagation (প্রসারণ)

Spring Boot ট্রানজেকশনের প্রসারণ নিয়ন্ত্রণ করতে বিভিন্ন Propagation মোড সরবরাহ করে:

  • REQUIRED: ডিফল্ট মোড; বিদ্যমান ট্রানজেকশনে যোগ দেয়, না থাকলে নতুন শুরু করে।
  • REQUIRES_NEW: সবসময় নতুন ট্রানজেকশন তৈরি করে।
  • NESTED: একটি বিদ্যমান ট্রানজেকশনের মধ্যে সাব-ট্রানজেকশন তৈরি করে।

Isolation Level (আইসোলেশন স্তর)

Spring Boot আইসোলেশন স্তর নির্ধারণ করতে দেয়:

  • READ_COMMITTED: কেবলমাত্র নিশ্চিত ডেটা পড়া যায়।
  • REPEATABLE_READ: একই ট্রানজেকশনের মধ্যে বারবার পড়লে একই ডেটা রিটার্ন হয়।
  • SERIALIZABLE: সম্পূর্ণ সিকোয়েন্সিয়াল ট্রানজেকশন প্রক্রিয়া।

Rollback Policy

কোনো নির্দিষ্ট Exception ঘটলে ট্রানজেকশন বাতিল করতে rollbackFor বা noRollbackFor ব্যবহার করা হয়।

@Transactional(rollbackFor = CustomException.class)
public void someTransactionalMethod() {
    // Method Logic
}

Transaction Management ব্যবহার কেন গুরুত্বপূর্ণ?

  1. ডেটার স্থায়িত্ব নিশ্চিত করে: অপারেশন ব্যর্থ হলেও ডেটাবেসের অবস্থা আগের অবস্থায় ফিরে আসে।
  2. ডেটাবেস কনসিস্টেন্সি বজায় রাখে: একাধিক অপারেশন একটি ইউনিট হিসাবে কাজ করে।
  3. ডেভেলপমেন্ট সহজ করে: @Transactional ব্যবহার করে স্বয়ংক্রিয়ভাবে কমিট বা রোলব্যাক করা হয়।

সারাংশ

Spring Boot এ Transaction Management ডেটাবেস অপারেশনগুলোর সঠিকতা ও স্থায়িত্ব নিশ্চিত করার জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে। @Transactional ব্যবহার করে Declarative পদ্ধতিতে সহজে ট্রানজেকশন পরিচালনা করা যায়, আর Programmatic পদ্ধতিতে ট্রানজেকশন নিয়ন্ত্রণের আরও বেশি ক্ষমতা পাওয়া যায়।

Content added By

@Transactional অ্যানোটেশন এর ব্যবহার

168

Spring Boot-এ @Transactional একটি গুরুত্বপূর্ণ অ্যানোটেশন, যা ডেটাবেজ ট্রানজেকশন পরিচালনার জন্য ব্যবহার করা হয়। এটি স্প্রিং ফ্রেমওয়ার্কের মাধ্যমে ট্রানজেকশন ম্যানেজমেন্ট সহজ এবং কার্যকর করে তোলে।


@Transactional অ্যানোটেশন কী?

@Transactional অ্যানোটেশন ব্যবহার করে একটি মেথড বা ক্লাসের মধ্যে ডেটাবেজ অপারেশনগুলোকে একটি ট্রানজেকশনাল কনটেক্সটে পরিচালনা করা হয়। এর অর্থ হলো, মেথডে থাকা সমস্ত ডেটাবেজ অপারেশন হয় একসাথে সফল হবে, নয়তো একসাথে ব্যর্থ হবে।


@Transactional এর সুবিধা

  1. অটোমেটিক রোলব্যাক: কোনো একটি অপারেশন ব্যর্থ হলে ট্রানজেকশন রোলব্যাক হয়।
  2. ডেটা ইন্টেগ্রিটি: ডেটাবেসে একাধিক অপারেশন করলে ডেটার সঠিকতা বজায় থাকে।
  3. সহজ ব্যবস্থাপনা: ম্যানুয়াল ট্রানজেকশন ম্যানেজমেন্টের ঝামেলা এড়ায়।
  4. ডেটাবেস লক: প্রয়োজনে নির্দিষ্ট অপারেশনগুলোকে লক করে ডেটা নিরাপদ রাখে।

@Transactional অ্যানোটেশন কনফিগারেশন

১. মেথড লেভেলে @Transactional

একটি নির্দিষ্ট মেথডে ট্রানজেকশন পরিচালনার জন্য @Transactional ব্যবহার করা হয়।

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ProductService {

    @Transactional
    public void saveProduct(Product product) {
        // Save product to the database
    }
}

২. ক্লাস লেভেলে @Transactional

ক্লাস লেভেলে @Transactional ব্যবহৃত হলে সেই ক্লাসের সমস্ত মেথড ট্রানজেকশনাল হিসেবে বিবেচিত হবে।

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class ProductService {

    public void saveProduct(Product product) {
        // Save product to the database
    }

    public void deleteProduct(Long id) {
        // Delete product from the database
    }
}

@Transactional এর কাজ করার পদ্ধতি

Spring ফ্রেমওয়ার্ক AOP (Aspect-Oriented Programming) ব্যবহার করে @Transactional পরিচালনা করে। যখন কোনো @Transactional মেথড এক্সিকিউট হয়, তখন একটি Proxy Object তৈরি হয়, যা মেথডের শুরুতে ট্রানজেকশন শুরু করে এবং মেথড শেষ হলে ট্রানজেকশন কমিট বা রোলব্যাক করে।


@Transactional এর গুরুত্বপূর্ণ অ্যাট্রিবিউটস

১. propagation

Propagation নির্ধারণ করে ট্রানজেকশন কীভাবে কাজ করবে, যদি কোনো মেথড আগে থেকেই ট্রানজেকশনে থাকে।

  • REQUIRED (ডিফল্ট): বিদ্যমান ট্রানজেকশন ব্যবহার করবে। না থাকলে নতুন একটি তৈরি করবে।
  • REQUIRES_NEW: সবসময় নতুন ট্রানজেকশন শুরু করবে।
  • MANDATORY: বিদ্যমান ট্রানজেকশন আবশ্যক, না থাকলে Exception ছুঁড়ে দেবে।
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveProduct(Product product) {
    // Always starts a new transaction
}

২. isolation

Isolation Level নির্ধারণ করে যে, একাধিক ট্রানজেকশন একসাথে চলার সময় ডেটার অ্যাক্সেস কীভাবে নিয়ন্ত্রণ করা হবে।

  • READ_COMMITTED: শুধুমাত্র কমিট করা ডেটা পড়তে পারবে।
  • READ_UNCOMMITTED: আনকমিট করা ডেটাও পড়তে পারবে।
  • REPEATABLE_READ: একই ডেটা বারবার পড়লে একই থাকবে।
  • SERIALIZABLE: ডেটাবেস টেবিল পুরোপুরি লক করবে।
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void updateProduct(Product product) {
    // Ensures the same data is read consistently
}

৩. rollbackFor

কোনো নির্দিষ্ট Exception ঘটলে ট্রানজেকশন রোলব্যাক হবে।

@Transactional(rollbackFor = RuntimeException.class)
public void deleteProduct(Long id) {
    // Rollback if RuntimeException occurs
}

৪. noRollbackFor

যদি নির্দিষ্ট Exception ঘটলেও রোলব্যাক না করতে হয়, এটি ব্যবহার করা হয়।

@Transactional(noRollbackFor = IllegalArgumentException.class)
public void updateProduct(Product product) {
    // No rollback for IllegalArgumentException
}

@Transactional ব্যবহার করার সময় সতর্কতা

  1. Public মেথডে ব্যবহার করুন: Spring AOP শুধুমাত্র public মেথডে কাজ করে।
  2. Proper Propagation Level: সঠিক propagation নির্বাচন করুন, কারণ এটি বিদ্যমান ট্রানজেকশনে প্রভাব ফেলতে পারে।
  3. Lazy Loading: ট্রানজেকশনের বাইরে Lazy-Loaded ডেটা অ্যাক্সেস করার চেষ্টা করলে Exception হতে পারে।

উদাহরণ: সম্পূর্ণ ব্যবহারের দৃশ্য

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

    @Autowired
    private ProductRepository productRepository;

    @Autowired
    private OrderRepository orderRepository;

    @Transactional
    public void placeOrder(Long productId, int quantity) {
        Product product = productRepository.findById(productId).orElseThrow(() -> new RuntimeException("Product not found"));
        
        if (product.getStock() < quantity) {
            throw new RuntimeException("Insufficient stock");
        }
        
        product.setStock(product.getStock() - quantity);
        productRepository.save(product);
        
        Order order = new Order();
        order.setProductId(productId);
        order.setQuantity(quantity);
        orderRepository.save(order);
    }
}

সারাংশ

@Transactional Spring Boot ORM এর একটি শক্তিশালী অ্যানোটেশন যা ডেটাবেস ট্রানজেকশন পরিচালনা সহজ করে। এটি ডেটার সঠিকতা বজায় রাখে এবং কোড সিম্পলিফাই করে। propagation, isolation, এবং rollbackFor এর মতো অ্যাট্রিবিউটগুলো ব্যবহার করে ট্রানজেকশন আরও কাস্টমাইজ করা যায়।

Content added By

Declarative এবং Programmatic Transaction Management

197

ডেটাবেসে একাধিক অপারেশন সম্পন্ন করার সময় নিশ্চিত করতে হয় যে, কোনো এক অপারেশনে ত্রুটি ঘটলে অন্য সব অপারেশনও রোলব্যাক (rollback) হবে। এ কাজটি Transaction Management এর মাধ্যমে সম্পন্ন করা হয়। স্প্রিং বুটে Declarative এবং Programmatic দুই পদ্ধতিতেই ট্রানজেকশন ম্যানেজমেন্ট করা যায়।


Transaction Management কি?

Transaction Management হলো ডেটাবেস অপারেশনের একটি নির্দিষ্ট ব্লক যা হয় সফলভাবে সম্পন্ন হবে, নয়ত পুরোপুরি রোলব্যাক করবে। এটি ডেটার অখণ্ডতা (data integrity) এবং সঙ্গতিপূর্ণতা (consistency) নিশ্চিত করে।


Declarative Transaction Management

Declarative Transaction Management-এ ট্রানজেকশন ম্যানেজমেন্ট কনফিগারেশন বা অ্যানোটেশনের মাধ্যমে ডিফাইন করা হয়। এটি সহজ এবং কোড কম লিখতে হয়।

@Transactional অ্যানোটেশন

স্প্রিং বুটে @Transactional অ্যানোটেশন ব্যবহার করে ট্রানজেকশন ডিফাইন করা হয়। এটি ক্লাস বা মেথডের উপর প্রয়োগ করা যায়।

উদাহরণ:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public void createUserAndProfile(User user, Profile profile) {
        userRepository.save(user);
        userRepository.saveProfile(profile);
        // যদি কোনো ত্রুটি ঘটে, তবে উভয় অপারেশন রোলব্যাক হবে।
    }
}

বুঝিয়ে বলি:

  • @Transactional: মেথডে ট্রানজেকশন সংজ্ঞায়িত করে।
  • যদি একটি অপারেশন ব্যর্থ হয়, তবে পুরো ট্রানজেকশন রোলব্যাক হবে।
  • এটি Propagation এবং Isolation Level সেট করতে পারে (ডিফল্ট REQUIRED এবং READ_COMMITTED)।

Propagation Example:

@Transactional(propagation = Propagation.REQUIRED)
public void method() {
    // Required propagation ট্রানজেকশন শেয়ার করে।
}

Programmatic Transaction Management

Programmatic Transaction Management-এ ডেভেলপার নিজের মতো করে কোড লিখে ট্রানজেকশন পরিচালনা করেন। এটি তখনই ব্যবহার করা হয়, যখন ট্রানজেকশনের উপর পূর্ণ নিয়ন্ত্রণ প্রয়োজন।

TransactionTemplate ব্যবহার

স্প্রিং বুটে TransactionTemplate ক্লাস ব্যবহার করে প্রোগ্রাম্যাটিক ট্রানজেকশন তৈরি করা যায়।

উদাহরণ:

import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;

@Service
public class UserService {

    private final UserRepository userRepository;
    private final TransactionTemplate transactionTemplate;

    public UserService(UserRepository userRepository, TransactionTemplate transactionTemplate) {
        this.userRepository = userRepository;
        this.transactionTemplate = transactionTemplate;
    }

    public void createUserAndProfile(User user, Profile profile) {
        transactionTemplate.execute(status -> {
            try {
                userRepository.save(user);
                userRepository.saveProfile(profile);
            } catch (Exception e) {
                status.setRollbackOnly(); // যদি কোনো ত্রুটি ঘটে, ট্রানজেকশন রোলব্যাক হবে।
                throw e;
            }
            return null;
        });
    }
}

বুঝিয়ে বলি:

  • TransactionTemplate.execute(): একটি ট্রানজেকশন ব্লক ডিফাইন করে।
  • status.setRollbackOnly(): ত্রুটি ঘটলে ট্রানজেকশন রোলব্যাক নিশ্চিত করে।

Declarative এবং Programmatic Transaction Management-এর তুলনা

বৈশিষ্ট্যDeclarativeProgrammatic
সহজতাঅ্যানোটেশন ব্যবহার করে সহজে পরিচালনা।কোড বেশি লিখতে হয়।
নিয়ন্ত্রণসীমিত নিয়ন্ত্রণ।সম্পূর্ণ নিয়ন্ত্রণ।
ইউজ কেসসাধারণ ট্রানজেকশন পরিচালনার জন্য।জটিল ট্রানজেকশনের জন্য।
নির্ভরতা@Transactional বা স্প্রিং অ্যানোটেশন।TransactionTemplate বা ম্যানুয়াল মেথড।

কনফিগারেশন: application.properties

ট্রানজেকশন ম্যানেজমেন্ট কার্যকর করার জন্য কিছু গুরুত্বপূর্ণ কনফিগারেশন প্রয়োজন:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.show_sql=true

সারাংশ

Declarative Transaction Management সাধারণ ট্রানজেকশন পরিচালনার জন্য সবচেয়ে উপযুক্ত, কারণ এটি অ্যানোটেশন ব্যবহার করে সহজে পরিচালিত হয়। অন্যদিকে, Programmatic Transaction Management তখন ব্যবহার করা হয়, যখন জটিল বা কাস্টম ট্রানজেকশন লজিক প্রয়োজন। স্প্রিং বুট ORM-এর এই দুই পদ্ধতি ডেভেলপারদের জন্য অত্যন্ত কার্যকরী সমাধান প্রদান করে।

Content added By

উদাহরণ সহ Transaction Management

180

ট্রানজ্যাকশন ম্যানেজমেন্ট (Transaction Management) হলো এমন একটি প্রক্রিয়া যা ডাটাবেস অপারেশনগুলোকে একটি একক ইউনিট হিসেবে পরিচালনা করে। এটি নিশ্চিত করে যে, একটি নির্দিষ্ট গুচ্ছ অপারেশন সম্পূর্ণ (commit) হবে অথবা সম্পূর্ণ বাতিল (rollback) হবে।

স্প্রিং বুটে ট্রানজ্যাকশন ম্যানেজমেন্ট খুব সহজে ব্যবহার করা যায়, কারণ এটি JPA এবং Hibernate এর ওপর ভিত্তি করে স্বয়ংক্রিয়ভাবে কাজ করে। স্প্রিং-এর @Transactional অ্যানোটেশন ব্যবহার করে এটি কনফিগার করা যায়।


স্প্রিং বুটে ট্রানজ্যাকশন ম্যানেজমেন্টের মূল বৈশিষ্ট্য

  • অটোমেটেড রোলব্যাক: ব্যর্থতার সময় ডেটা অটোমেটিক্যালি পূর্বের অবস্থায় ফিরে যায়।
  • ACID প্রপার্টি মেইনটেইন করা: এটি নিশ্চিত করে যে ট্রানজ্যাকশনগুলি Atomicity, Consistency, Isolation, এবং Durability মেনে চলে।
  • ডেটা ইনটিগ্রিটি: একাধিক ডেটাবেস অপারেশন একটি লজিক্যাল ইউনিটে একত্রিত করা হয়।

@Transactional অ্যানোটেশনের ব্যবহার

স্প্রিং বুটে @Transactional অ্যানোটেশন ব্যবহার করে সহজেই ট্রানজ্যাকশন পরিচালনা করা যায়। এই অ্যানোটেশনটি Service লেয়ারে সাধারণত ব্যবহার করা হয়।

উদাহরণ: একটি Employee Management সিস্টেম

Entity ক্লাস
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String department;

    // Getter এবং Setter
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

Repository ইন্টারফেস
import org.springframework.data.jpa.repository.JpaRepository;

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

Service ক্লাস: ট্রানজ্যাকশন ম্যানেজমেন্ট
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class EmployeeService {
    private final EmployeeRepository employeeRepository;

    public EmployeeService(EmployeeRepository employeeRepository) {
        this.employeeRepository = employeeRepository;
    }

    @Transactional
    public void saveEmployeeData(Employee employee1, Employee employee2) {
        // প্রথম এমপ্লয়ি সেভ করা
        employeeRepository.save(employee1);

        // ইচ্ছাকৃতভাবে একটি এক্সেপশন থ্রো করা
        if (employee2.getName() == null) {
            throw new RuntimeException("Employee name cannot be null");
        }

        // দ্বিতীয় এমপ্লয়ি সেভ করা
        employeeRepository.save(employee2);
    }
}

Controller ক্লাস
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    @PostMapping("/save")
    public String saveEmployees(@RequestBody Employee employee1, @RequestBody Employee employee2) {
        try {
            employeeService.saveEmployeeData(employee1, employee2);
            return "Employees saved successfully!";
        } catch (RuntimeException e) {
            return "Error: " + e.getMessage();
        }
    }
}

ব্যাখ্যা

  1. @Transactional:
    • saveEmployeeData মেথডে @Transactional ব্যবহার করা হয়েছে। এর ফলে যদি employee2 সেভ করার সময় কোনো ব্যতিক্রম ঘটে, তাহলে employee1 এর সেভ অপারেশন রোলব্যাক হয়ে যাবে।
  2. Error Handling:
    • RuntimeException বা অন্য কোনো ব্যতিক্রম ঘটলে ট্রানজ্যাকশন বাতিল (rollback) হবে এবং ডাটাবেসের পূর্ববর্তী অবস্থা বজায় থাকবে।

ট্রানজ্যাকশন প্রোপার্টি

@Transactional অ্যানোটেশন এর মধ্যে কিছু অতিরিক্ত প্রোপার্টি ব্যবহার করা যায়:

1. Propagation

ট্রানজ্যাকশন কীভাবে একটি নতুন বা বিদ্যমান ট্রানজ্যাকশনকে পরিচালনা করবে তা নির্ধারণ করে।
উদাহরণ:

@Transactional(propagation = Propagation.REQUIRED)

2. Isolation

ট্রানজ্যাকশনের আইসোলেশন লেভেল নির্ধারণ করে। উদাহরণ:

@Transactional(isolation = Isolation.READ_COMMITTED)

3. Rollback For

নির্দিষ্ট ব্যতিক্রমের জন্য রোলব্যাক কনফিগার করা যায়। উদাহরণ:

@Transactional(rollbackFor = RuntimeException.class)

সম্পূর্ণ উদাহরণ: Rollback এবং Commit

@Transactional(rollbackFor = Exception.class)
public void performTransaction() {
    // Step 1: Save first entity
    entityRepository.save(entity1);

    // Step 2: Simulate an exception
    if (true) {
        throw new RuntimeException("Simulated Exception");
    }

    // Step 3: Save second entity
    entityRepository.save(entity2);
}

উপরের কোডে, Step 1-এর অপারেশন রোলব্যাক হবে যদি Step 2-এ এক্সেপশন ঘটে।


সারাংশ

  • @Transactional ব্যবহার করে সহজেই ট্রানজ্যাকশন পরিচালনা করা যায়।
  • ব্যর্থ হলে পুরো ট্রানজ্যাকশন রোলব্যাক হয়, যা ডেটাবেসের ইন্টিগ্রিটি রক্ষা করে।
  • Propagation এবং Isolation Level সঠিকভাবে ব্যবহার করে কার্যকারিতা বাড়ানো যায়।
  • স্প্রিং বুট ORM ট্রানজ্যাকশন ম্যানেজমেন্টের মাধ্যমে ACID প্রোপার্টি নিশ্চিত করে।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...